package priv.conceit.sc.hoxton.common.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * sc-hoxton
 *
 * @author Conceit
 * 2020/4/27 增加方法
 * @since 1.0.0, 2020/4/27
 */
public class FileUtil {


	/**
	 * 获取文件后缀名 原始文件名分离后
	 *
	 * @param originalFileName 原始文件名
	 * @return 返回类型 String 文件后缀
	 */
	public static String getFileSuffix(String originalFileName) {
		if (StrUtil.isEmpty(originalFileName)) {
			return null;
		}
		return originalFileName.substring(originalFileName.lastIndexOf(".") + 1);
	}

	/**
	 * 获取文件前缀 原始文件名分离后
	 *
	 * @param originalFileName 原始文件名
	 * @return 返回类型 String 文件名
	 */
	public static String getFilePrefix(String originalFileName) {
		if (StrUtil.isEmpty(originalFileName)) {
			return null;
		}
		return originalFileName.substring(0, originalFileName.lastIndexOf("."));
	}

	/**
	 * 替换文件后缀名
	 *
	 * @param originalFileName 原始文件名
	 * @param replacement      替换的字符串
	 * @return 返回类型 String 替换后的文件名
	 */
	public static String replaceFileSuffix(String originalFileName, String replacement) {
		if (StrUtil.isEmpty(originalFileName) || StrUtil.isEmpty(replacement)) {
			return null;
		}
		return originalFileName.substring(0, originalFileName.lastIndexOf(".") + 1) + replacement;
	}

	/**
	 * hasUploadFile
	 * 查看是否包含文件上传
	 *
	 * @param multipartFile 文件
	 * @return: boolean
	 * @author: conceit
	 * @date: 2019/6/26 17:50
	 */
	public static boolean hasUploadFile(MultipartFile multipartFile) {
		if (Objects.isNull(multipartFile)) {
			return Boolean.FALSE;
		}
		return multipartFile.isEmpty() ? Boolean.FALSE : Boolean.TRUE;
	}

	/**
	 * 获取全部的文件名称集合
	 *
	 * @param multipartFiles 文件列表
	 * @return: List<String>文件名称集合
	 * @author: conceit
	 * @date: 2020/06/03 17:50
	 */
	public static List<String> getFileNames(List<MultipartFile> multipartFiles) {
		if (CollUtil.isEmpty(multipartFiles)) {
			return Collections.EMPTY_LIST;
		}
		return multipartFiles.stream()
				.map(MultipartFile::getOriginalFilename)
				.collect(Collectors.toList());
	}

	/**
	 * hasUploadFile
	 * 查看是否包含文件上传
	 *
	 * @param multipartFiles 文件
	 * @return: boolean
	 * @author: conceit
	 * @date: 2019/6/26 17:50
	 */
	public static boolean hasUploadFile(List<MultipartFile> multipartFiles) {
		if (CollUtil.isEmpty(multipartFiles)) {
			return Boolean.FALSE;
		}
		return multipartFiles.stream().anyMatch(x -> hasUploadFile(x));
	}


	/**
	 * buildDownload 生成下载响应
	 *
	 * @param downloadFileName 文件名
	 * @param bytes            文件byte数组
	 * @param mediaType        下载类型
	 * @param httpStatus       响应状态
	 * @param fileNameEncode   文件名编码
	 * @return: org.springframework.http.ResponseEntity
	 * @author: conceit
	 * @date: 2019/6/21 15:33
	 */
	public static ResponseEntity buildDownload(String downloadFileName, byte[] bytes, MediaType mediaType, HttpStatus httpStatus, String fileNameEncode) {

		String finalDownloadFileName = downloadFileName;
		try {
			finalDownloadFileName = URLEncoder.encode(downloadFileName, fileNameEncode);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(mediaType);
		headers.setContentDispositionFormData("attachment", finalDownloadFileName);
		headers.setContentLength(bytes.length);

		return ResponseEntity.status(httpStatus).headers(headers).body(bytes);
	}


}
